namespace classifier_test
{

namespace high_order
{

class high_order_classifier : public stream_classifier
{
public:
	high_order_classifier();
	high_order_classifier(const high_order_classifier& Val);
	smart_ptr<stream_classifier> clone() const;
	void serialize(serializer& Serializer);
	concept_cutter* get_cutter() const;
	concept_clustering* get_clustering() const;
	concept_cleaner* get_cleaner() const;
	stream_predictor* get_predictor() const;

	void build(subarray<const stream_record* const> Data);
	void train(const stream_record& Record);
	discr_value classify(const stream_record& Record) const;
	void estimate(const stream_record& Record, array<double>& Probs) const;
	int get_concept_count() const;
	const array<double>& get_state_probabilities() const;

protected:
	void initialize_options(command_line_options& Options) const;
	void apply_arguments(const command_line_arguments& Args);

	int Cross;
	smart_ptr<concept_cutter> Cutter;
	smart_ptr<concept_clustering> Clustering;
	smart_ptr<concept_cleaner> Cleaner;
	smart_ptr<stream_predictor> Predictor;
};

}

using high_order::high_order_classifier;

}
